<?php
/**
 * Dodatki do formularza umożliwajace układanie grup komponentów (szczegolnie checkboxów, radiobuttonów)
 * do postaci kolumnowej lub wierszowej
 * @author admin
 *
 */ 
class UkladKomponentow {

	/**
	 * Układa komponenty wierszami lub kolumnami - główna metoda
	 * @param unknown_type $controls
	 * @param unknown_type $liczbaKolumn
	 * @param unknown_type $wirszami
	 */
    public function uluzKomonenty($controls, $liczbaKolumn ,$wierszami = false)
    { 
    	$k = $this->przygotujKontrolki($controls);
    	if ($wierszami) {
            $controls = $this->_uluzWierszami($k, $liczbaKolumn);
    	} else {
    		$controls = $this->_uluzKolumnami($k, $liczbaKolumn);
    	}
    	$xhtml = "<tr></tr>";
        $xhtml .= implode('', $controls);
        
        return "<table>".$xhtml."</table>";   
    }
	
	/**
     * Metoda układająca wierszami
     * @param array $elementy
     */
    protected function _uluzWierszami(array $elementy, $columns)
    {
    	$controls = $elementy;
    	$iloscCheck  = count($controls);

    	$ilosc = $iloscCheck / $columns;
    	$naKoncu = $iloscCheck%$columns;
    	$koncowe = array();
        if ($naKoncu) {
            while ($naKoncu) {
            	$koncowe[] = array_pop($controls); 
            	$naKoncu--;
            }
        
        }
    	$i=0;
    	foreach  ($controls as &$control) {
    	    
    	    $i++; 
    	    if ($i == $columns) {
    	    	
	    		$control .=  '</tr>';
	    		$i = 0;
	    	}
    		if ($i == 1) {
	    		$control = '<tr><td>' . $control . '</td>';
	    	} else { 
	            $control  = '<td>' . $control . '</td>';
	    	}            
    	}
    	$i = 0;
	    while ($w = array_pop($koncowe)) {
	    		if  ($i == 0) {
	    			array_push($controls, '<tr><td>'. $w .'</td>');
	    		} else {
	    		    array_push($controls, '<td>'. $w .'</td>');	
	    		}
	    		$i++;
	     	}
    	
     	$last = array_pop($controls);
     	$last .= '</tr>';
     	array_push($controls, $last);
     	
     	return $controls;	   	
    }
    
    /**
     * Układa kontrolki  kolumnami
     * @param $elementy
     * @return array
     */
    protected function _uluzKolumnami(array $elementy, $columns)
    {
    	$controls = $elementy;  	
        $iloscCheck  = count($controls);
        $iloscCheck  = count($controls);
        $ilosc = $iloscCheck / $columns;
        $ilosc = (int)$ilosc;
    	$odwrocona = array();
    	$iloscPrzetworzonych = 0; 
        $modulo = $iloscCheck%$columns;
        //Jęsli nie ma równego podziału w kolumnach zwiększamu ilosć elementów w wierszu o 1 żeby dodać jedną niepełną kolumnę 
        if ($modulo) {
    		$ilosc+=1;
    	}
        //reszta z dzielenia daje nam informację, w którym wieszu powinniśmy dostawić pustą kolumnę aby tabela pozstała równa 
    	$indeks = $iloscCheck % $ilosc;
    	//odwracamy 
        for ($i = 0; $i < $ilosc; $i++) {
    		 for ($j = $i; $j < $iloscCheck; $j+= $ilosc ) {    			      	  
    		      $odwrocona[] = $controls[$j];	  
         	 }
    	     if ($indeks) 
    	     {
               // jeśli próbujemy odwołać się  do elementu który jest poza zakresem tablicy, 
               //tzn ze w tym miejscu bedzię się znajdował pusty element wirsza
               // aby dopełnić tabekę 
    		   if($i>$indeks-1)
    		   {
    			 	$odwrocona[] = '&nbsp;';
    		   }
    	    }
        }
    		$controls = $odwrocona;
	    	$i=0;
	    	foreach  ($controls as &$control) {
	    	    
	    	    $i++; 
	    	    if ($i == $columns) {
		    		$control .=  '</tr>';
		    		$i = 0;
		    	}
	    		if ($i == 1) {
		    		$control = '<tr><td>' . $control . '</td>';
		    	} else { 
		            $control  = '<td>' . $control . '</td>';
		    	}
	            
	    	}
            return $controls;		 	
    }
    
    /**
     * Obudowuj kontrolke w kod html
     * @param $v
     */
	public function przygotujKontrolki($v) 
	{
	     $kontrolki = array();
	     $typ_kontrolki ='';
	     $opcje = $v->getMultiOptions();
	     if($v->getType()=='Zend_Form_Element_Radio')
	     	$typ_kontrolki = 'radio';
	     if($v->getType()=='Zend_Form_Element_MultiCheckbox')
	     	$typ_kontrolki = 'checkbox';
	     	
	     foreach ($opcje as $key => $value) {
	     			//$kontrolka = '<label>' 
	     	        $kontrolka = '<label for="'. $v->getId() . '-' . $key. '">' 
	     	        
                    //. $this->_htmlAttribs($label_attribs) . ' for="'. $v->getId() . '-' . $key. '">'
                    //. (('prepend' == $labelPlacement) ? $opt_label : '')
                   //@amazur . '<input type="' . $v->getAttrib('type') . '"'

                    . '<input type="' . $typ_kontrolki . '"'
                    . ' name="' . $v->getName() . '[]"'
                    . ' id="' . $v->getId() . '-'. $key.'"'
                    . ' value="' . $key . '"/>'
                    //. $checked
                    //. $disabled
                    //. $v->getAttribs();
                    //. $endTag
                    //. (('append' == $labelPlacement) ? $opt_label : '')
                    . $value
                    . '</label>';
	     	$kontrolki[] = $kontrolka;
	     }
	     return $kontrolki;
	}
	
}